#include "abstractvideosurface.h"

AbstractVideoSurface::AbstractVideoSurface(QObject* parent):
    QAbstractVideoSurface(parent)
{

}

bool AbstractVideoSurface::present(const QVideoFrame &frame)
{
    if(frame.isValid())
    {
        qDebug() << "present";
        // 该函数会在摄像头拍摄到每一帧的图片后，自动调用

        //  图像处理函数，目标是把图片的格式从 QVideoFrame转换成 QPixmap(或者是能够轻易的转化成QPixmap的其他类)
        QVideoFrame fm = frame;//拷贝构造，内部地址浅拷贝，视频帧依旧存放于不可读取的内存上，需要进行映射
        fm.map(QAbstractVideoBuffer::ReadOnly);//映射视频帧内容，映射到可访问的地址上

        //现在 QVideroFrame，视频帧数据可正常访问了

        QImage image(fm.bits(),fm.width(),fm.height(),fm.imageFormatFromPixelFormat(fm.pixelFormat()));

        // 注意，摄像头拍摄到的图片，是上下左右相反的，所以我们还需要镜像一下
        image = image.mirrored(false, false);//表示横向镜像，纵向镜像是默认值
        emit sndImage(image);

        fm.unmap();
        return true;
    }
    stop();
    return false;
}

QList<QVideoFrame::PixelFormat> AbstractVideoSurface::supportedPixelFormats(QAbstractVideoBuffer::HandleType type) const
{
    Q_UNUSED(type);
//  这个函数在  AbstractVideoSurface构造函数的时候，自动调用，目的是确认AbstractVideoSurface能够支持的像素格式，摄像头拍摄到的图片，他的像素格式是 RGB_3

// 所以，我们要把RGB_32这个像素格式，添加到AbstractVideoSurface支持列表里面了
// 当前函数，返回的就是AbstractVideoSurface所支持的像素格式的列表
    if(type == QAbstractVideoBuffer::NoHandle){
        return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB32;
    }
    else{
        return QList<QVideoFrame::PixelFormat>();
    }

}
